module.exports = (option, app) => {
    // 返回一个中间件函数
    return async (ctx, next) => {
        try {
            ctx.cast = cast;
            await next();
        } catch (error) {
            // 抛出错误方便控制台查看
            app.emit('error', error, this);

            // 处理 swagger 参数校验错误信息
            if (error.status === 422) {
                ctx.body = {
                    code: 400,
                    message: '参数校验失败',
                };
                return;
            }

            // 自定义异常
            if (error instanceof RuntimeException) {
                ctx.body = {
                    ...error,
                };
                return;
            }

            ctx.body = {
                code: 500,
                message: '程序出错了',
            };
        }
    };
};

/**
 * 声明一个异常类
 * 用来在抛出错误时，携带异常信息
 */
class RuntimeException {
    constructor(code, message) {
        this.code = code;
        this.message = message;
    }
}

/**
 * 抛出异常函数
 * @param {*} code
 * @param {*} message
 */
const cast = (code, message) => {
    throw new RuntimeException(code, message);
};
